package fr.skolian.controler
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.filesystem.File;
	import flash.utils.Dictionary;
	
	import fr.skolian.command.ConnectDB;
	import fr.skolian.command.GetConfig;
	import fr.skolian.command.GetMedias;
	import fr.skolian.command.GetTags;
	import fr.skolian.command.GetTree;
	import fr.skolian.core.command.CommandEvent;
	import fr.skolian.core.command.MacroCommand;
	import fr.skolian.core.config.Config;
	import fr.skolian.model.Model;
	import fr.skolian.utils.log.Log;
	import fr.skolian.utils.sql.SQLHelper;
	import fr.skolian.view.arborescence.Arborescence;
	
	
/*Skolian - Content management system for primary school - Copyright (c) 2011 - Olivier Gianotti - This file is part of Skolian. Skolian is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Skolian is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Skolian.  If not, see <http://www.gnu.org/licenses/>.
contact : ogianotti@gmail.com 

Skolian - Application de gestion de contenus pédagogiques en école primaire. Copyright (C) 2011 - Olivier Gianotti - Ce fichier est une partie de Skolian. Skolian est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier au titre des clauses de la Licence Publique Générale GNU, telle que publiée par la Free Software Foundation ; soit la version 2 de la Licence, ou (à votre discrétion) une version ultérieure quelconque. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE ; sans même une garantie implicite de COMMERCIABILITE ou DE CONFORMITE A UNE UTILISATION PARTICULIERE. Voir la Licence Publique Générale GNU pour plus de détails. Vous devriez avoir reçu un exemplaire de la Licence Publique Générale GNU avec ce programme ; si ce n'est pas le cas, consultez <http://www.gnu.org/licenses/>.
contact : ogianotti@gmail.com 
*/

public class FrontControler extends EventDispatcher
	{
		private var _sqlHelper:SQLHelper;
		private var _model:Model;
		private var _arborescence:Arborescence;
		
		private static var _instance:FrontControler = new FrontControler();
		
		public function FrontControler()
		{
			super();
			_sqlHelper = new SQLHelper();
			_model = new Model();
		}
		
		public static function getInstance():FrontControler{
			return _instance;
		}
		
		public function init():void{
				
				var initCommand:MacroCommand = new MacroCommand(false,true);
				var config:GetConfig = new GetConfig();
				var connect:ConnectDB = new ConnectDB(_sqlHelper,"db/skolian.db");
				initCommand.addCommand(config);
				initCommand.addCommand(connect);
				initCommand.addCompleteListener(onInitCommandComplete);
				initCommand.execute();
		}
		
		public function config(owner:String,folder:File):void{
			Log.debug("FrontController.config : "+owner+", "+folder);
			_model.owner = owner,
			_model.root = folder;
		}
		
		public function update():void{
			
			Log.debug("FrontController.update");
			var updateCommand:MacroCommand = new MacroCommand(true,true);
			var medias:GetMedias = new GetMedias(_sqlHelper,_model);
			var tags:GetTags = new GetTags(_sqlHelper,_model);
			var tree:GetTree = new GetTree(_model);
			updateCommand.addCommand(medias);
			updateCommand.addCommand(tags);
			updateCommand.addCommand(tree);
			updateCommand.addCompleteListener(onUpdateCommandComplete);
			updateCommand.execute();
		}
		
		private function onInitCommandComplete(event:CommandEvent):void
		{
			// TODO Auto Generated method stub
			dispatchEvent(new Event(Event.INIT));
			
		}
		
		private function onUpdateCommandComplete(event:CommandEvent):void
		{
			// TODO Auto Generated method stub
			_model.setOrphans();
			dispatchEvent(new Event(Event.COMPLETE));
			
		}
		
		public function get sqlHelper():SQLHelper
		{
			return _sqlHelper;
		}

		public function get model():Model
		{
			return _model;
		}


		public function getFiles():Dictionary
		{
			// TODO Auto Generated method stub
			return _model.directory.globalListing;
		}
		
		public function openArborescence(file:File=null):void
		{
			if(_arborescence && !_arborescence.closed)return;
			_arborescence = new Arborescence();
			_arborescence.open(true);// TODO Auto Generated method stub
			if(file)_arborescence.openSubdirectory(file);
			
		}
	}
}